package com.bnz.canal.listener;

import com.alibaba.fastjson.JSON;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.bnz.canal.entity.BrandEntity;
import com.xpand.starter.canal.annotation.CanalEventListener;
import com.xpand.starter.canal.annotation.InsertListenPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.List;

/**
 * @功能: 使用canal 对数据库操作进行监控
 * @描述:
 **/
@CanalEventListener
public class MyEventListener {

    @Autowired
    private StringRedisTemplate redisTemplate;


    // 数据库进行插入操作时
    @InsertListenPoint
    public void onInsertEvent(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        //do something...
//        System.out.println("插入操作--->操作时间： " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//        rowData.getAfterColumnsList().stream().forEach(f->{
//            String name = f.getName();
//            String value = f.getValue();
//            System.out.println(name + "--->" + value );
//        });
        System.out.println("插入操作---更新缓存-------");
        BrandEntity brandEntity = new BrandEntity();
        rowData.getAfterColumnsList().stream().forEach(f->{
            // 1. 得到要添加的列名
            String name = f.getName();
            // 2. 得到列名的值
            String value = f.getValue();
            // 3. 符合条件就赋值
            switch (name) {
                case "id":
                    brandEntity.setId(value);
                    break;
                case "name":
                    brandEntity.setName(value);
                    break;
                case "first_char":
                    brandEntity.setFirstChar(value);
                    break;
            }
        });
            // 4.得到redis中原来的值
            String brands = redisTemplate.opsForValue().get("brands");
            // 5.将得到的值变成对象数组
            List<BrandEntity> brandEntities = JSON.parseArray(brands, BrandEntity.class);
            // 6. 将新加的值加入到数组中
            brandEntities.add(brandEntity);
            // 7. 将这个集合重新放到redis中
            redisTemplate.opsForValue().set("brands", JSON.toJSONString(brandEntities));

            System.out.println("------------------添加成功！------------------");

    }

//    // 数据库进行修改操作时
//    @UpdateListenPoint(destination = "example",schema = "bng_manager" ,table = "tb_brand")
//    public void onUpdateEvent(CanalEntry.RowData rowData) {
//        System.out.println("修改操作--->操作时间： " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//        //do something...
//        rowData.getAfterColumnsList().stream().forEach(f->{
//            String name = f.getName();
//            String value = f.getValue();
//            System.out.println(name + "--->" + value);
//        });
//    }
//
//    // 数据库进行删除操作时
//    @DeleteListenPoint(destination = "example",schema = "bng_manager" ,table = "tb_brand")
//    public void onDeleteEvent(CanalEntry.EventType eventType,CanalEntry.RowData rowData) {
//        System.out.println("删除操作--->操作时间： " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//        //do something...
//        rowData.getBeforeColumnsList().stream().forEach(f->{
//            String name = f.getName();
//            String value = f.getValue();
//            System.out.println(name + "--->" + value);
//        });
//    }

    /**
     * destination 指定监听实例
     * schema	指定监听数据库名称
     * table	指定表名 {"user"} || {"user","user_info"}
     * eventType 指定监听CURD类型
     */
    // 自定义监听，当某个事件（增删改）会被触发
//    @ListenPoint(destination = "example",
//            schema = "bng_manager",
//            table = {"tb_item"},
//            eventType = {
//            CanalEntry.EventType.UPDATE,
//            CanalEntry.EventType.INSERT,
//            CanalEntry.EventType.DELETE})
//
//    public void onCustomEvent(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
//        //do something...
//        if (CanalEntry.EventType.INSERT == eventType) {
//            System.out.println("insert 操作。。。");
//            rowData.getAfterColumnsList().stream().forEach(f->{
//                String name =  f.getName();
//                String value = f.getValue();
//                System.out.println( name + "-->" + value);
//            });
//        }
//        if (CanalEntry.EventType.UPDATE == eventType) {
//            System.out.println("update 操作。。。");
//            rowData.getAfterColumnsList().stream().forEach(f->{
//                String name =  f.getName();
//                String value = f.getValue();
//                System.out.println( name + "-->" + value);
//            });
//        }
//        if (CanalEntry.EventType.DELETE == eventType) {
//            System.out.println("delete 操作。。。");
//            rowData.getAfterColumnsList().stream().forEach(f->{
//                String name =  f.getName();
//                String value = f.getValue();
//                System.out.println( name + "-->" + value);
//            });
//        }
//    }
}